package com.yupi.yuaiagent.rag;

import com.yupi.yuaiagent.config.BaiduTranslateConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.rag.Query;
import org.springframework.ai.rag.preretrieval.query.transformation.QueryTransformer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 基于百度翻译API的自定义QueryTransformer
 * 使用百度翻译API代替Spring AI内置的基于大模型的翻译工具，降低成本
 */
@Component
@Slf4j
public class BaiduTranslateQueryTransformer implements QueryTransformer {

    @Autowired
    private BaiduTranslateService baiduTranslateService;

    @Autowired
    private BaiduTranslateConfig config;

    /**
     * 转换查询
     * @param query 原始查询
     * @return 转换后的查询
     */
    @Override
    public Query transform(Query query) {
        // 如果百度翻译未启用，直接返回原始查询
        if (!config.isEnabled()) {
            return query;
        }
        
        if (query == null || query.text() == null || query.text().trim().isEmpty()) {
            return query;
        }

        String originalText = query.text();
        log.info("开始转换查询: {}", originalText);

        try {
            // 1. 首先检测查询语言
            String detectedLanguage = detectLanguage(originalText);
            log.debug("检测到的语言: {}", detectedLanguage);

            // 2. 根据检测到的语言进行相应的转换处理
            String transformedText;
            
            if ("en".equals(detectedLanguage)) {
                // 如果是英文，翻译成中文
                transformedText = baiduTranslateService.enToZh(originalText);
                log.info("英文翻译成中文: {} -> {}", originalText, transformedText);
            } else if ("zh".equals(detectedLanguage)) {
                // 如果是中文，进行查询重写优化
                transformedText = optimizeChineseQuery(originalText);
                log.info("中文查询优化: {} -> {}", originalText, transformedText);
            } else {
                // 其他语言，先翻译成中文
                transformedText = baiduTranslateService.translate(originalText, detectedLanguage, "zh");
                log.info("其他语言翻译成中文: {} -> {}", originalText, transformedText);
            }

            // 3. 添加上下文和语义增强
            transformedText = addContextualEnhancement(transformedText);
            log.info("添加上下文增强: {}", transformedText);

            // 4. 返回转换后的查询
            Query transformedQuery = new Query(transformedText);
            log.info("查询转换完成: {} -> {}", originalText, transformedText);
            
            return transformedQuery;

        } catch (Exception e) {
            log.error("查询转换失败，返回原始查询", e);
            return query; // 出错时返回原始查询
        }
    }

    /**
     * 简单的语言检测
     * @param text 要检测的文本
     * @return 语言代码（zh, en, auto）
     */
    private String detectLanguage(String text) {
        if (text == null || text.trim().isEmpty()) {
            return "auto";
        }

        // 简单的中文字符检测
        int chineseCount = 0;
        int englishCount = 0;
        int totalCount = 0;

        for (char c : text.toCharArray()) {
            if (Character.isLetter(c)) {
                englishCount++;
                totalCount++;
            } else if (isChineseChar(c)) {
                chineseCount++;
                totalCount++;
            }
        }

        if (totalCount == 0) {
            return "auto";
        }

        double chineseRatio = (double) chineseCount / totalCount;
        double englishRatio = (double) englishCount / totalCount;

        if (chineseRatio > 0.3) {
            return "zh";
        } else if (englishRatio > 0.7) {
            return "en";
        } else {
            return "auto";
        }
    }

    /**
     * 判断是否为中文字符
     * @param c 字符
     * @return 是否为中文字符
     */
    private boolean isChineseChar(char c) {
        return c >= 0x4E00 && c <= 0x9FFF; // 基本汉字范围
    }

    /**
     * 优化中文查询
     * @param query 原始中文查询
     * @return 优化后的查询
     */
    private String optimizeChineseQuery(String query) {
        // 移除不必要的空格和特殊字符
        query = query.trim().replaceAll("\\s+", " ");
        
        // 添加查询重写提示，使其更适合RAG检索
        if (!query.contains("请") && !query.contains("如何") && !query.contains("怎么") && 
            !query.contains("什么") && !query.contains("为什么")) {
            // 如果是陈述句，转换为疑问句形式
            if (query.length() < 20) {
                query = "请问" + query + "是什么意思？";
            } else {
                query = "请帮我理解：" + query;
            }
        }

        // 添加语义增强关键词
        if (query.contains("恋爱") || query.contains("感情") || query.contains("爱情")) {
            query = query + " (恋爱关系 情感问题 爱情建议)";
        }

        return query;
    }

    /**
     * 添加上下文增强
     * @param query 查询文本
     * @return 增强后的查询
     */
    private String addContextualEnhancement(String query) {
        // 添加RAG友好的前缀和后缀
        String enhancedQuery = "请基于恋爱知识和情感经验回答以下问题：" + query;
        
        // 根据查询类型添加相应的上下文
        if (query.contains("分手") || query.contains("失恋")) {
            enhancedQuery += " (请提供具体的挽回建议或心理调适方法)";
        } else if (query.contains("表白") || query.contains("追求")) {
            enhancedQuery += " (请提供实用的表白技巧或追求策略)";
        } else if (query.contains("吵架") || query.contains("矛盾")) {
            enhancedQuery += " (请提供沟通技巧和关系修复建议)";
        }

        return enhancedQuery;
    }
}